import 'package:dio/dio.dart';
import 'package:get/get.dart';
import 'package:enterprise_v8/app/core/http/http.dart';

/// Controller 关闭时, 自动取消网络请求
mixin HttpRequestAutoDisposeMixin on GetxController {
  CancelToken? _cancelToken;

  final List<CancelToken> _cancelTokenList = [];

  CancelToken get httpCancelToken {
    assert(!isClosed, 'Controller 已经关闭');
    if (_cancelToken == null || _cancelToken!.isCancelled) {
      _cancelToken = CancelToken();
      addHttpAutoDispose(_cancelToken!);
    }
    return _cancelToken!;
  }

  void addHttpAutoDispose(CancelToken cancelToken) {
    _cancelTokenList.add(cancelToken);
  }

  @override
  void onClose() {
    if (_cancelTokenList.isNotEmpty) {
      for (var value in _cancelTokenList) {
        HttpUtil().cancelRequests(value);
      }
    }

    super.onClose();
  }
}

extension CancelTokenExtension on CancelToken {
  void autoDispose(HttpRequestAutoDisposeMixin mixin) {
    mixin.addHttpAutoDispose(this);
  }
}

extension HttpRequestExtension<T> on HttpRequest<T> {
  /// controller 关闭时, 自动取消请求
  Future<Result<T>>? executeAutoDispose(HttpRequestAutoDisposeMixin mixin) {
    return execute(cancelToken: mixin.httpCancelToken);
  }
}
